package 算法基础模板.chapter_01.双指针.sliding_window;

/**
 * 1052. 爱生气的书店老板
 * 今天，书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客（customers[i]）会进入书店，所有这些顾客都会在那一分钟结束后离开。
 *
 * 在某些时候，书店老板会生气。 如果书店老板在第 i 分钟生气，那么 grumpy[i] = 1，否则 grumpy[i] = 0。 当书店老板生气时，那一分钟的顾客就会不满意，不生气则他们是满意的。
 *
 * 书店老板知道一个秘密技巧，能抑制自己的情绪，可以让自己连续 X 分钟不生气，但却只能使用一次。
 *
 * 请你返回这一天营业下来，最多有多少客户能够感到满意的数量。
 *
 *
 * 示例：
 *
 * 输入：customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3
 * 输出：16
 * 解释：
 * 书店老板在最后 3 分钟保持冷静。
 * 感到满意的最大客户数量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.
 *
 *
 * 提示：
 *
 * 1 <= X <= customers.length == grumpy.length <= 20000
 * 0 <= customers[i] <= 1000
 * 0 <= grumpy[i] <= 1
 * @author Summerday
 */
public class LC1052 {

    public int maxSatisfied(int[] customers, int[] grumpy, int X) {
        int max_cus = 0, sum = 0;
        // 所有不生气时间内的顾客总数
        for(int i = 0; i < grumpy.length; i ++){
            sum += customers[i] * (1 - grumpy[i]);
        }
        // 生气的X分中内， 会让多少顾客不满意
        for(int i = 0; i < X; i ++){
            max_cus += customers[i] * grumpy[i];
        }
        int cur_cus = max_cus;
        // 滑动窗口
        for(int i = X; i < grumpy.length; i ++){
            // 如果新进入窗口的元素是生气的， 加到不满意的顾客窗口中
            // 如果离开窗口的元素是生气的，移除
            cur_cus = cur_cus + customers[i] * grumpy[i] - customers[i - X] * grumpy[i - X];
            // 求所有窗口内不满意顾客的最大值
            max_cus = Math.max(cur_cus, max_cus);
        }
        // 不生气时的顾客总数 + 窗口内挽留因为生气赶走的顾客
        return max_cus + sum;
    }
}
